package email

import (
	"a-common/config"
	"a-common/core/redis"
	"crypto/tls"
	"fmt"
	"net/mail"
	"net/smtp"
	"strconv"
	"sync"
	"time"

	"math/rand"

	"github.com/jordan-wright/email"
)

var (
	emailUtilTemp *emailUtil
	redisCli      = redis.New()
	emailUtilOnce sync.Once
)

type emailUtil struct{}

func New() *emailUtil {
	emailUtilOnce.Do(func() {
		emailUtilTemp = &emailUtil{}
	})
	return emailUtilTemp
}

func (m *emailUtil) SendCode(toEmail, sub, doing string) error {
	// 校验邮箱参数是否合法
	_, err := mail.ParseAddress(toEmail)
	if err != nil {
		return err
	}
	// 获取是否已发送邮件
	_, err = redisCli.Get("emailCode:" + toEmail)
	if err == nil {
		return err
	}
	// if vCode != "" {
	// 	return errors.New(res.LOGIN_ERR_CODE.Msg)
	// }

	// 获取6位随机数
	code := fmt.Sprintf("%0"+strconv.Itoa(6)+"v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))

	err = redisCli.SetEx("emailCode:"+toEmail, code, 300)
	if err != nil {
		return err
	}

	conf := config.Config

	em := email.NewEmail()
	// 设置 receiver 接收方
	em.To = []string{toEmail}
	// 设置主题
	em.Subject = sub
	// 设置 sender 发送方
	em.From = conf.Mail.Sender
	// 设置文件发送的内容
	em.HTML = []byte(m.htmlModel(doing, code, conf.Mail.Sign))
	err = em.SendWithTLS(
		conf.Mail.Server,
		smtp.PlainAuth(
			"",
			conf.Mail.From,
			conf.Mail.SecKey,
			conf.Mail.Smtp,
		),
		&tls.Config{
			InsecureSkipVerify: true,
			ServerName:         conf.Mail.Smtp,
		})
	return err
}

func (m *emailUtil) Verify(email string, code string) bool {
	_, err := mail.ParseAddress(email)
	if err != nil {
		return false
	}
	vCode, err := redisCli.Get("emailCode:" + email)
	if err != nil {
		return false
	}
	if vCode == code {
		// 当完成校验后应将验证过的code删除
		_ = redisCli.Del("emailCode:" + email)
	}
	return vCode == code
}

func (m *emailUtil) htmlModel(doing string, code string, lk string) string {
	return `
	<head>
    <base target="_blank" />
    <style type="text/css">::-webkit-scrollbar{ display: none; }</style>
    <style id="cloudAttachStyle" type="text/css">#divNeteaseBigAttach, #divNeteaseBigAttach_bak{display:none;}</style>
    <style id="blockquoteStyle" type="text/css">blockquote{display:none;}</style>
    <style type="text/css">
        body{font-size:14px;font-family:arial,verdana,sans-serif;line-height:1.666;padding:0;margin:0;overflow:auto;white-space:normal;word-wrap:break-word;min-height:100px}
        td, input, button, select, body{font-family:Helvetica, 'Microsoft Yahei', verdana}
        pre {white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;width:95%}
        th,td{font-family:arial,verdana,sans-serif;line-height:1.666}
        img{ border:0}
        header,footer,section,aside,article,nav,hgroup,figure,figcaption{display:block}
        blockquote{margin-right:0px}
    </style>
</head>
<body tabindex="0" role="listitem">
<table width="700" border="0" align="center" cellspacing="0" style="width:700px;">
    <tbody>
    <tr>
        <td>
            <div style="width:700px;margin:0 auto;border-bottom:1px solid #ccc;margin-bottom:30px;">
                <table border="0" cellpadding="0" cellspacing="0" width="700" height="39" style="font:12px Tahoma, Arial, 宋体;">
                    <tbody><tr><td width="210"></td></tr></tbody>
                </table>
            </div>
            <div style="width:680px;padding:0 10px;margin:0 auto;">
                <div style="line-height:1.5;font-size:14px;margin-bottom:25px;color:#4d4d4d;">
                    <strong style="display:block;margin-bottom:15px;">尊敬的用户：<span style="color:#f60;font-size: 16px;"></span>您好！</strong>
                    <strong style="display:block;margin-bottom:15px;">
                        您正在进行<span style="color: red">` + doing + `</span>操作，请在验证码输入框中输入：<span style="color:#f60;font-size: 24px">` + code + `</span>，以完成操作。
                    </strong>
                </div>
                <div style="margin-bottom:30px;">
                    <small style="display:block;margin-bottom:20px;font-size:12px;">
                        <p style="color:#747474;">
                            注意：此操作可能会修改您的密码、登录邮箱或绑定手机。如非本人操作，请及时登录并修改密码以保证帐户安全
                            <br>（工作人员不会向你索取此验证码，请勿泄漏！)
                        </p>
                    </small>
                </div>
            </div>
            <div style="width:700px;margin:0 auto;">
                <div style="padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;">
                    <p>此为系统邮件，请勿回复<br>
                        请保管好您的邮箱，避免账号被他人盗用
                    </p>
                    <p>` + lk + `</p>
                </div>
            </div>
        </td>
    </tr>
    </tbody>
</table>
</body>
`
}
